package routers

import (
	"MyWeb/docs"
	"MyWeb/internal/config"
	"MyWeb/internal/controllers/api/shortURL"
	"MyWeb/internal/pkg/middlewares/cor"
	"MyWeb/internal/pkg/middlewares/logmiddle"
	"MyWeb/internal/repositories"
	"MyWeb/internal/service"
	"github.com/gin-gonic/gin"

	_ "MyWeb/docs"
	swaggerFiles "github.com/swaggo/files"     // swagger embed files
	ginSwagger "github.com/swaggo/gin-swagger" // gin-swagger middleware
)

// @title           短链接项目
// @version         1.0
// @description     这是一个短链接生成项目的接口文档
// @termsOfService  这是一个使用条款（内部使用可以不写）

// @contact.name   陈阿七
// @contact.url    无
// @contact.email  无

// @host      http://localhost:8080
// @BasePath  /api/v1

// @securityDefinitions.basic  BasicAuth(JWT)

// @externalDocs.description  OpenAPI
// @externalDocs.url          https://swagger.io/resources/open-api/

func InitRouter(cfg *config.Configuration) {
	gin.SetMode(cfg.Server.Mode)
	r := gin.New() //获取一个gin的引擎实例
	//r := gin.Default() //这个是创建了一个默认的gin实例对象
	docs.SwaggerInfo.Version = "1.0"

	r.Use(logmiddle.Logger()) // 日志中间件
	r.Use(gin.Recovery())     //
	r.Use(cor.Cors())         // 跨域中间件

	repo := repositories.NewUrlMapRepoUse()
	service := service.NewUrlService(repo)
	UrlHandler := shortURL.NewURLHandler(service)

	r.GET("/:code", UrlHandler.RedirectURL)
	apiv1 := r.Group("/api/v1")
	{
		apiv1.POST("/shorturl", UrlHandler.CreateURL)
	}

	// use ginSwagger middleware to serve the API docs
	r.GET("/swagger/*any", ginSwagger.WrapHandler(swaggerFiles.Handler))
	r.Run(cfg.Server.HttpPort)
}
